#include<stdio.h>
const int N=270005,M=N<<2;

#define ll long long

int T,n,m,K,S,X[4];
int a[N],b[N],c[N],t[M],g[M];
ll res,ans;
char d[20][N];

#define mid (l+r>>1)
#define ls (x<<1)
#define rs (x<<1|1)

void build(int x,int k,int l,int r){
	if(k){
		build(ls,k-1,l,mid);
		build(rs,k-1,mid+1,r);

		if(d[k][r>>k]^48){
			if(t[rs]>=k){
				t[x]=t[rs];
				g[x]=g[rs];
			}else{
				t[x]=t[ls];
				g[x]=g[ls];
			}
		}else{
			if(t[ls]>=k){
				t[x]=t[ls];
				g[x]=g[ls];
			}else{
				t[x]=t[rs];
				g[x]=g[rs];
			}
		}
	}else t[x]=(b[l]>K?K:b[l]),g[x]=l;
}

inline ll sum(int l,int r){
	return 1ll*(l+r)*(r-l+1)/2ll;
}

int query(int x,int k,int l,int r,int p,int v,int fl){
	if(k){
		if(p<=mid){
			if(d[k][r>>k]^48){
				int f=query(ls,k-1,l,mid,p,v,fl);

				if(fl) res+=sum(mid+1,r);

				return f|(S^((1<<k)-1));
			}else{
				int f=fl?(v?query(ls,k-1,l,mid,p,v,fl):query(ls,k-1,l,mid,p,k,fl)):query(ls,k-1,l,mid,p,v,fl);

				if((f&-f)<(1<<k)){
					if(fl) res+=sum(mid+1,r);

					return S;
				}else return f;
			}
		}else{
			if(d[k][r>>k]^48){
				int f=v?query(rs,k-1,mid+1,r,p,v,1):query(rs,k-1,mid+1,r,p,k,1);

				if((f&-f)<(1<<k)){
					if(t[ls]>=v) res+=g[ls];

					return f&(S^((1<<k)-1))|(1<<t[ls]);
				}else return f;
			}else if(t[ls]<k) return query(rs,k-1,mid+1,r,p,v,1);
			else{
				if(t[ls]>=v) res+=g[ls];

				return 1<<t[ls];
			}
		}
	}else{
		if(t[x]>=v) res+=l;

		return 1<<t[x];
	}
}

int main(){
	freopen("arena.in","r",stdin);
	freopen("arena.out","w",stdout);

	int i;
	scanf("%d%d",&n,&m);

	for(K=0;(1<<K)<n;K++);

	S=(1<<K)-1;

	for(i=1;i<=n;i++) scanf("%d",&a[i]);
	for(i=1;i<=m;i++) scanf("%d",&c[i]);
	for(i=1;i<=K;i++) scanf("%s",d[i]+1);

	scanf("%d",&T);

	while(T--){
		for(i=0;i<4;i++) scanf("%d",&X[i]);
		for(i=1;i<=n;i++) b[i]=a[i]^X[i%4];

		build(1,K,1,S+1);
		ans=0;

		for(i=1;i<=m;i++){
			res=0;
			query(1,K,1,S+1,c[i],0,0);
			ans^=res*i;
		}

		printf("%lld\n",ans);
	}

	return 0;
}